#from tushare_mirror import daily_warpper
import pandas as pd
'''
单根K线形态的分类
以下是常见的单根K线形态：
    阳线（Bullish）：收盘价高于开盘价。
    阴线（Bearish）：收盘价低于开盘价。
    十字星（Doji）：开盘价和收盘价几乎相等。
    锤子线（Hammer）：实体较小，下影线较长，通常出现在下跌趋势中。
    上吊线（Hanging Man）：形态与锤子线类似，但出现在上涨趋势中。
    射击之星（Shooting Star）：实体较小，上影线较长，通常出现在上涨趋势中。
    倒锤子线（Inverted Hammer）：实体较小，上影线较长，通常出现在下跌趋势中。
    蜻蜓十字星（Dragonfly Doji）：开盘价和收盘价位于最高价附近，下影线较长。
    墓碑十字星（Gravestone Doji）：开盘价和收盘价位于最低价附近，上影线较长。
    大阳线（Long White Candle）：实体较长，收盘价远高于开盘价。
    大阴线（Long Black Candle）：实体较长，收盘价远低于开盘价。
    小阳线（Short White Candle）：实体较短，收盘价略高于开盘价。
    小阴线（Short Black Candle）：实体较短，收盘价略低于开盘价。
    纺锤线（Spinning Top）：实体较小，上下影线较长。
    一字线（Four Price Doji）：开盘价、收盘价、最高价和最低价几乎相等。
'''

def judge_single_kline(open_price, close_price, high_price, low_price):
    """
    判断单根K线的形态
    :param open_price: 开盘价
    :param close_price: 收盘价
    :param high_price: 最高价
    :param low_price: 最低价
    :return: 单根K线形态
    """
    body = abs(close_price - open_price)
    upper_shadow = high_price - max(open_price, close_price)
    lower_shadow = min(open_price, close_price) - low_price
    total_range = high_price - low_price  # K线的总范围

    # 判断实体和影线的比例
    body_ratio = body / total_range if total_range != 0 else 0
    upper_shadow_ratio = upper_shadow / total_range if total_range != 0 else 0
    lower_shadow_ratio = lower_shadow / total_range if total_range != 0 else 0

    # 判断单根K线形态
    if body == 0:
        if upper_shadow == 0 and lower_shadow > 0:
            return "Dragonfly Doji (蜻蜓十字星)"
        elif lower_shadow == 0 and upper_shadow > 0:
            return "Gravestone Doji (墓碑十字星)"
        elif upper_shadow == 0 and lower_shadow == 0:
            return "Four Price Doji (一字线)"
        else:
            return "Doji (十字星)"
    elif close_price > open_price:
        if body_ratio > 0.7:
            return "Long White Candle (大阳线)"
        elif body_ratio < 0.3:
            if lower_shadow_ratio > 0.6:
                return "Hammer (锤子线)"
            elif upper_shadow_ratio > 0.6:
                return "Inverted Hammer (倒锤子线)"
            else:
                return "Spinning Top (纺锤线)"
        else:
            return "Short White Candle (小阳线)"
    elif close_price < open_price:
        if body_ratio > 0.7:
            return "Long Black Candle (大阴线)"
        elif body_ratio < 0.3:
            if upper_shadow_ratio > 0.6:
                return "Shooting Star (射击之星)"
            elif lower_shadow_ratio > 0.6:
                return "Hanging Man (上吊线)"
            else:
                return "Spinning Top (纺锤线)"
        else:
            return "Short Black Candle (小阴线)"
    else:
        return "Unknown (未知形态)"


# 测试单根K线形态
def test_single_kline():
    test_cases = [
        (100, 105, 110, 95),  # 大阳线
        (100, 95, 105, 90),   # 大阴线
        (100, 101, 102, 99),  # 小阳线
        (100, 99, 101, 98),   # 小阴线
        (100, 100, 105, 95),  # 十字星
        (100, 100, 100, 100), # 一字线
        (100, 105, 105, 90),  # 锤子线
        (100, 95, 110, 95),   # 射击之星
        (100, 105, 110, 100), # 倒锤子线
        (100, 95, 100, 90),   # 上吊线
        (100, 100, 105, 100), # 蜻蜓十字星
        (100, 100, 100, 95),  # 墓碑十字星
        (100, 102, 105, 98),  # 纺锤线
    ]

    for open_price, close_price, high_price, low_price in test_cases:
        print(f"开盘价: {open_price}, 收盘价: {close_price}, 最高价: {high_price}, 最低价: {low_price}")
        print("K线形态:", judge_single_kline(open_price, close_price, high_price, low_price))
        print("-" * 50)


# 运行测试
test_single_kline()

df=pd.read_csv("000001.SZ_20240101_20250226.csv")
print(df.shape)

for index, row in df.iterrows():
    open_price=row['open']
    high_price=row['high']
    low_price=row['low']
    close_price=row['close']
    trade_date=row['trade_date']
    print(f"日期:{trade_date}","K线形态：",judge_single_kline(open_price, close_price, high_price, low_price))


